from django.shortcuts import render

# Create your views here.
"""
需求:     获取一个图片验证码


前端:     当用户第一次访问页面或者点击注册验证码的时候, 会发送一个请求.这个请求要携带 用户的唯一id [UUID]
            这个UUID是前端生成传递. 会随着请求传递给后端服务器

后端:
        请求
                GET         http://ip:port/image_codes/uuid/
        业务逻辑
                1. 接收请求参数
                2. 验证请求参数
                3. 生成图片验证码,获取图片验证码的内容[4个字母]
                4. 将 图片验证码的内容[4个字母] 保存到redis中. key:value
                        key --> uuid
                        value --> [4个字母]
                5. 返回响应
        响应
                返回图片二进制数据

"""
from django.views import View
from django_redis import get_redis_connection
from libs.captcha.captcha import captcha
from django.http import HttpResponse
from django.http import JsonResponse
class ImageCodeView(View):

    def get(self,request,uuid):
        # 返回 第一个数据是 图片验证码的内容
        # 返回 第二个数据是 图片验证码的图片二进制
        text,image = captcha.generate_captcha()
        #链接redis_server
        redis_cli = get_redis_connection('code')
        # 返回数据
        redis_cli.setex(uuid,300,text)

        #响应
        return HttpResponse(image,content_type='image/jpeg')


############短信验证码实现
class SMSCodeView(View):

    def get(self,request,mobile):
        #接收参数
        query_params = request.GET
        #获取参数
        image_code = query_params.get('image_code')  # 用户输入的
        image_code_id = query_params.get('image_code_id')  #uuid
        # 3. 验证参数 [课上省略]
        # 3.1 验证 image_code的长度
        # 3.2 验证 image_code_id的 正则形式
        if len(image_code) != 4 :
            return JsonResponse({'code':400,'errmsg':'验证码格式输入错误'})


        # 4. 比对用户输入的图片验证码和服务器的图片验证码是否一致
        # 4.1 用户输入的图片验证码
        redis_cli = get_redis_connection('code')   #连接数据库
        redis_text = redis_cli.get(image_code_id)  # 提取数据库的验证码
        # 因为我们的图片验证码有一定的时效 获取的也可能是None
        if redis_text is None:
            return JsonResponse({'code':400,'errmsg':'图片验证码过期'})

        #服务器的图片验证码 获取后删除uuid
        redis_cli.delete(image_code_id)

        #对比
        if redis_text.decode().lower() != image_code.lower():
            return JsonResponse({'code':400,'errmsg':'图片验证码错误'})

        #判断标记位
        send_flag = redis_cli.get('send_%s'%mobile)

        if send_flag is not None:
            return JsonResponse({'code':400,'errmsg':'不要频繁操作'})

        #生成短信验证码
        from random import randint
        sms_code = '%06d'%randint(0,999999)

        # 创建一个管道
        pipeline = redis_cli.pipeline()

        #管道保存验证码
        pipeline.setex(mobile,300,sms_code)

        #设计一个标记位，标记为的时间是60秒 ，避免频繁操作

        pipeline.setex('send_%s'%mobile,300,sms_code)

        #执行管道
        pipeline.execute()

        #发送验证码
        from utils.sms import send_sms_code

        send_sms_code(mobile,sms_code,5)
        # from celery_meiduo.sms.tasks import celery_send_sms_code
        # celery_send_sms_code.delay(mobile,sms_code,5)

        return JsonResponse({'code':0})

